package main

import "fmt"

/**
指向 interface 的指针:
	您几乎不需要指向接口类型的指针。您应该将接口作为值进行传递，在这样的传递过程中，实质上传递的底层数据仍然可以是指针。

接口实质上在底层用两个字段表示：

1.一个指向某些特定类型信息的指针。您可以将其视为"type"。
2.数据指针。如果存储的数据是指针，则直接存储。如果存储的数据是一个值，则存储指向该值的指针。

如果希望接口方法修改基础数据，则必须使用指针传递(将对象指针赋值给接口变量)。
*/

//定义一个接口
type F interface {
	show()
	f()
}

//定义一个结构体S1，实现F接口
type S1 struct {
	Age int
}

//方法使用结构体类型
func (s S1) f() {
	s.Age = 10
}

func (s S1) show() {
	fmt.Println(s.Age)
}

//定义一个结构体体S2，实现F接口
type S2 struct {
	Age int
}

//方法使用指针类型
func (s *S2) f() {
	s.Age = 10
}

func (s *S2) show() {
	fmt.Println(s.Age)
}

func main_u1() {
	var s = S1{Age: 2}

	s.f()    // 将s进行了一份拷贝传递，不能改变s的数据
	s.show() //还是2

	s2 := S2{Age: 1}
	s2.f()    //传递的是s2的指针，可以改变s2的数据
	s2.show() //10

}
